package cn.cosmosx.base.config.props;

import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import springfox.documentation.service.ParameterType;

import java.util.List;

/**
 * 全局配置文件
 */
@Component("globalConfig")
@ConfigurationProperties(prefix = "qs")
public class GlobalConfig {

    /**
     * SM2证书信息
     */
    private Certificate certificate;
    private static Certificate defaultCertificate;

    /**
     * Swagger
     */
    private Swagger swagger;
    private static Swagger defaultSwagger;

    /**
     * 是否截取票据承兑人括号前内容
     */
    private boolean subBillAcceptanceLeftBrackets;

    /**
     * 是否开启加密
     */
    private boolean enableEncrypt;

    /**
     * 代理配置
     */
    private Proxy proxy;
    private static Proxy defaultProxy;

    /**
     * Ocr配置
     */
    private Ocr ocr;
    private static Ocr defaultOcr;

    /**
     * ssh2连接配置
     */
    private Ssh2 ssh2;
    private static Ssh2 defaultSsh2;

    /**
     * API接口服务扫描包，如果是多个包，使用英文逗号分隔
     */
    private String apiServiceInterfacePackages;
    private static String defaultApiServiceInterfacePackages;

    // **************************getter/setter*******************************

    public Certificate getCertificate() {
        return certificate;
    }

    public void setCertificate(Certificate certificate) {
        this.certificate = certificate;
        GlobalConfig.defaultCertificate = certificate;
    }

    public void setSwagger(Swagger swagger) {
        this.swagger = swagger;
        GlobalConfig.defaultSwagger = swagger;
    }

    public Swagger getSwagger() {
        return swagger;
    }

    public boolean isSubBillAcceptanceLeftBrackets() {
        return subBillAcceptanceLeftBrackets;
    }

    public void setSubBillAcceptanceLeftBrackets(boolean subBillAcceptanceLeftBrackets) {
        this.subBillAcceptanceLeftBrackets = subBillAcceptanceLeftBrackets;
    }

    public boolean isEnableEncrypt() {
        return enableEncrypt;
    }

    public void setEnableEncrypt(boolean enableEncrypt) {
        this.enableEncrypt = enableEncrypt;
    }

    public Proxy getProxy() {
        return proxy;
    }

    public void setProxy(Proxy proxy) {
        this.proxy = proxy;
        GlobalConfig.defaultProxy = proxy;
    }

    public Ocr getOcr() {
        return ocr;
    }

    public void setOcr(Ocr ocr) {
        this.ocr = ocr;
        GlobalConfig.defaultOcr = ocr;
    }

    public Ssh2 getSsh2() {
        return ssh2;
    }

    public void setSsh2(Ssh2 ssh2) {
        this.ssh2 = ssh2;
        GlobalConfig.defaultSsh2 = ssh2;
    }

    public String getApiServiceInterfacePackages() {
        return apiServiceInterfacePackages;
    }

    public void setApiServiceInterfacePackages(String apiServiceInterfacePackages) {
        this.apiServiceInterfacePackages = apiServiceInterfacePackages;
        GlobalConfig.defaultApiServiceInterfacePackages = apiServiceInterfacePackages;
    }
    // **************************static getter*******************************

    /**
     * 获取Swagger全局配置
     *
     * @return - Swagger
     */
    public static Swagger swagger() {
        return GlobalConfig.defaultSwagger;
    }

    /**
     * 获取Certificate全局配置
     *
     * @return - Certificate
     */
    public static Certificate certificate() {
        return GlobalConfig.defaultCertificate;
    }

    /**
     * 获取Proxy全局配置
     *
     * @return - Proxy
     */
    public static Proxy proxy() {
        return GlobalConfig.defaultProxy;
    }

    /**
     * 获取Ocr全局配置
     *
     * @return - Ocr
     */
    public static Ocr ocr() {
        return GlobalConfig.defaultOcr;
    }

    /**
     * 获取Ssh2全局配置
     *
     * @return - Ssh2
     */
    public static Ssh2 ssh2() {
        return GlobalConfig.defaultSsh2;
    }

    /**
     * 获取Ssh2全局配置
     *
     * @return - Ssh2
     */
    public static String apiServiceInterfacePackages() {
        return GlobalConfig.defaultApiServiceInterfacePackages;
    }
    // **************************Object definition*******************************

    /**
     * Ocr配置
     */
    @Getter
    @Setter
    public static class Ocr {
        /**
         * Baidu Ocr配置
         */
        private BaiduOcr baidu;
        /**
         * Baidu Ocr配置
         */
        private TencentOcr tencent;

        /**
         * Tencent Ocr配置
         */
        @Getter
        @Setter
        public static class BaiduOcr {
            /**
             * 百度智能云注册的应用程序APP_ID
             */
            private String appId;
            /**
             * 百度智能云注册的应用程序API_KEY
             */
            private String appKey;
            /**
             * 百度智能云注册的应用程序SECRET_KEY
             */
            private String secretKey;
        }

        /**
         * Tencent Ocr配置
         */
        @Getter
        @Setter
        public static class TencentOcr {
            /**
             * 腾讯云注册的应用程序APP_ID
             */
            private String appId;
            /**
             * 腾讯云注册的应用程序API_KEY
             */
            private String secretId;
            /**
             * 腾讯云注册的应用程序SECRET_KEY
             */
            private String secretKey;
        }
    }

    /**
     * 代理配置
     */
    @Getter
    @Setter
    public static class Proxy {
        /**
         * 是否启用远程代理[true/false]
         */
        private boolean enable;
        /**
         * 代理主机
         */
        private String host;
        /**
         * 代理端口
         */
        private int port;
    }

    /**
     * Swagger
     */
    @Getter
    @Setter
    public static class Swagger {
        /**
         * 是否启用swagger
         */
        private boolean enable;
        /**
         * 自定义swagger请求信息（如请求头、请求参数等），可参照定义多个
         * <p>
         * name：请求参数名；desc：请求参数描述；
         * <p>
         * paramType请求参数类型（QUERY,HEADER,PATH,COOKIE,FORM,FORMDATA,BODY），默认HEADER；
         * <p>
         * defaultValue: 请求参数默认值；required：是否必填（默认false）
         */
        private List<Param> params;

        /**
         * 自定义swagger请求信息（如请求头、请求参数等），可参照定义多个
         * <p>
         * name：请求参数名；desc：请求参数描述；
         * <p>
         * paramType请求参数类型（QUERY,HEADER,PATH,COOKIE,FORM,FORMDATA,BODY），默认HEADER；
         * <p>
         * defaultValue: 请求参数默认值；required：是否必填（默认false）
         */
        @Getter
        @Setter
        public static class Param {
            // 请求参数名
            private String name;
            // 请求参数描述
            private String desc;
            /**
             * 请求参数类型：QUERY("query"),HEADER("header"),PATH("path"),
             * COOKIE("cookie"),FORM("form"),FORMDATA("formData"),BODY("body");
             */
            private ParameterType paramType = ParameterType.HEADER;

            // 请求参数默认值
            private String defaultValue = "";
            // 是否必填
            private boolean required = false;

            // 是否隐藏
            private boolean hidden = false;
        }
    }

    /**
     * SM2证书信息
     */
    @Getter
    @Setter
    public static class Certificate {
        /**
         * 证书路径
         */
        private String pfxPath;
        /**
         * 证书访问密码
         */
        private String password;
        /**
         * 证书别名
         */
        private String alias;
    }

    /**
     * ssh2连接配置
     */
    @Getter
    @Setter
    public static class Ssh2 {
        /**
         * IP地址
         */
        private String ip;
        /**
         * 端口号（默认22）
         */
        private int port = 22;
        /**
         * 访问用户名
         */
        private String username;
        /**
         * 访问密码
         */
        private String password;
    }
}
